//
// Created by Administrator on 2021/11/13.
// May Saint Diana bless you!
//
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    bool detectCapitalUse(string word) {
        if (word.size() == 1)
            return true;
        if (isupper(word[0])) { // 首字母大写 只要后面的大小写相同即可
            return sameCapitalUse(word, 1, word.size());
        } else { // 首字母小写 必须剩下所有的都小写
            return (!isupper(word[1]) && sameCapitalUse(word, 1, word.size()));
        }
        return false;
    }

    /**
     * 查询一个string是不是从start到end全部大写或者全部小写
     * @param word
     * @param start 包含
     * @param end  不包含
     * @return
     */
    bool sameCapitalUse(string &word, int start, int end) {
        bool upperState = isupper(word[start]); // 起始位置是不是大写
        for (int i = start + 1; i < end; ++i) {
            if (isupper(word[i]) != upperState)
                return false;
        }
        return true;
    }
};

class Solution2 { // 题解
public:
    bool detectCapitalUse(string word) {
        // 若第 1 个字母为小写，则需额外判断第 2 个字母是否为小写
        if (word.size() >= 2 && islower(word[0]) && isupper(word[1])) {
            // 第一个字母小写 第二个字母大写 肯定错误
            return false;
        }
        // 无论第 1 个字母是否大写，其他字母必须与第 2 个字母的大小写相同
        for (int i = 2; i < word.size(); ++i) {
            if (islower(word[i]) ^ islower(word[1])) { //XOR 同0异1
                return false;
            }
        }
        return true;
    }
};

int main() {
    Solution solution;
    cout << solution.detectCapitalUse("USA") << endl;
    cout << solution.detectCapitalUse("FlaG") << endl;
    cout << solution.detectCapitalUse("flag") << endl;
    cout << solution.detectCapitalUse("flaG") << endl;
    cout << solution.detectCapitalUse("Flag") << endl;
    return 0;
}


